﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <set>

using namespace std;

//int main()
//{
//	//set<int> si;
//	set<int, greater<int>> si;
//	si.insert(7);
//	si.insert(2);
//	si.insert(3);
//	si.insert(7);
//	si.insert(2);
//	si.insert(5);
//
//	/*for (auto e : si)
//	{
//		cout << e << " ";
//	}
//	cout << endl;*/
//
//
//	si.insert({ 3,3,3,7,8,10 });
//
//	auto it = si.begin();
//	while (it != si.end())
//	{
//		*it += 2;
//
//		cout << *it << " ";
//		++it;
//	}
//
//	return 0;
//}


//int main()
//{
//	set<int> s = { 4,2,7,2,8,5,9 };
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	// 删除最⼩值 
//	s.erase(s.begin());
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	int x;
//	cin >> x;
//	auto pos = s.find(x);
//	if (pos != s.end())
//	{
//		s.erase(pos);
//		cout << x << "已经删除了" << endl;
//	}
//	else
//	{
//		cout << x << "不存在！" << endl;
//	}
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//
//	cin >> x;
//	if (s.count(x))
//	{
//		cout << x << "在！" << endl;
//	}
//	else
//	{
//		cout << x << "不存在！" << endl;
//	}
//
//	
//	return 0;
//}

//int main()
//{
//	std::set<int> myset;
//	for (int i = 1; i < 10; i++)
//		myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90
//	for (auto e : myset)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	// [30, 50]值
//	// [25, 55]值
//	 
//	// 返回 >= 30
//	auto itlow = myset.lower_bound(30);
//	// 返回 > 50
//	auto itup = myset.upper_bound(50);
//
//	// 返回 >= 25
//	auto itlow = myset.lower_bound(25);
//	// 返回 > 55
//	auto itup = myset.upper_bound(55);
//
//	// 删除这段区间的值
//	myset.erase(itlow, itup);
//	for (auto e : myset)
//	{
//		cout << e << " ";
//	}
//
//	cout << endl;
//	
//	return 0;
//}

//int main()
//{
//	multiset<int> s = { 4,2,7,2,4,8,4,5,4,9 };
//	auto it = s.begin();
//	while (it != s.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//
//
//	int x;
//	cin >> x;
//	s.erase(x);
//
//	it = s.begin();
//	while (it != s.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//
//	/*int x;
//	cin >> x;
//	auto pos = s.find(x);
//	while (pos != s.end() && *pos == x)
//	{
//		cout << *pos << " ";
//		++pos;
//	}
//	cout << endl;*/
//
//	/*int x;
//	cin >> x;
//
//	cout << s.count(x) << endl;*/
//
//	return 0;
//}


//int main()
//{
//	/*pair<string, string> p({"中国","china"});
//	cout << p.first << ":" << p.second << endl;*/
//
//
//	string s1("hahahahaha");
//	string s2("哈哈哈哈哈");
//
//	//传对象
//	pair<string, string> p1 = make_pair(s1, s2);
//	cout << p1.first << ":" << p1.second << endl; 
//
//	//隐式类型转换
//	pair<string, string> p2 = make_pair("hello", "你好");
//	cout << p2.first << ":" << p2.second << endl;
//
//
//	return 0;
//}

#include <map>

//int main()
//{
//	//无参构造
//	map<string,int> m1;
//
//	//初始化列表构造
//	//传的参数要是一个pair,可以传一个也可以传多个
//	pair<string, int> p1("apple", 1);
//	pair<string, int> p2("pear", 1);
//	pair<string, int> p3("orange", 1);
//
//	//有名对象
//	map<string, int> m2({ p1,p2,p3 });
//
//	//匿名对象
//	map<string, int> m3({ pair<string,int>("apple",1) });
//
//	//隐式类型转换
//	//先隐式类型转换成pair对象，再生成一个map临时对象，最后再拷贝构造给m4，但是编译器优化为直接构造
//	map<string, int> m4({ {"apple",1},{"pear",1},{"orange",1} });
//	//map<string, int> m4 = { {"apple",1},{"pear",1},{"orange",1} }; 与上面等价
//
//	return 0;
//}


//int main()
//{
//	//map的insert插入的都是一个pair对象，是一个key和value的结合体
//
//	map<string, string> m;
//	pair<string, string> p("string", "字符串");
//
//	//插入有名对象
//	m.insert(p);
//
//	//匿名对象
//	m.insert(pair<string, string>("apple", "苹果"));
//
//	//借助make_pair函数
//	m.insert(make_pair("pear", "梨"));
//
//	//隐式类型转换
//	m.insert({ "orange","橙子" });
//
//	//插入一段初始化列表
//	m.insert({ {"left","左边"},{"right","右边"} });
//
//
//	return 0;
//}


//int main()
//{
//	map<string, string> m;
//	m.insert({ {"left","左边"},{"right","右边"} });
//	auto it = m.begin();
//	while (it != m.end())
//	{
//		cout << it->first << ":" << it->second << endl;
//		++it;
//	}
//	cout << endl;
//
//	m.insert({ "left","左边的abj" });
//	it = m.begin();
//	while (it != m.end())
//	{
//		cout << it->first << ":" << it->second << endl;
//		++it;
//	}
//
//	return 0;
//}


//int main()
//{
//	map<string, string> m;
//	pair<string, string> p("string", "字符串");
//
//	//插入有名对象
//	m.insert(p);
//
//	//匿名对象
//	m.insert(pair<string, string>("apple", "苹果"));
//
//	//借助make_pair函数
//	m.insert(make_pair("pear", "梨"));
//
//	//隐式类型转换
//	m.insert({ "orange","橙子" });
//
//	//插入一段初始化列表
//	m.insert({ {"left","左边"},{"right","右边"} });
//
//
//	auto it = m.begin();
//	while (it != m.end())
//	{
//		//cout << *it << endl;
//		//cout << (*it).first << ":" << (*it).second << endl;
//		//cout << it.operator->()->first << ":" << it.operator->()->second << endl;
//		it->second = "hhhhhhhh";
//		cout << it->first << ":" << it->second << endl;
//		++it;
//	}
//
//	return 0;
//}


//int main()
//{
//	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };
//	map<string, int> m;
//	for (const auto& str : arr)
//	{
//		m[str]++;
//
//
//		/*auto ret = m.find(str);
//		if (ret == m.end())
//		{
//			m.insert({ str,1 });
//		}
//		else
//		{
//			ret->second++;
//		}*/
//	}
//
//	auto it = m.begin();
//	while (it != m.end())
//	{
//		cout << it->first << " : " << it->second << endl;
//		++it;
//	}
//
//	return 0;
//}

//
//int main()
//{
//	map<string, string> m;
//
//	//left不存在，插入
//	m["left"];
//
//	//right不存在，插入+修改
//	m["right"] = "右边";
//
//	//查找,[]查找的前提是你知道它在，否则就插入了
//	cout << m["right"] << endl;
//
//	//left存在，修改
//	m["left"] = "abj,左边的";
//
//	return 0;
//}


int main()
{
	// g++ gdb
	multimap<string, string> dict;
	// 一定成功
	dict.insert({ "sort", "排序" });
	dict.insert({ "sort", "排序2" });
	dict.insert({ "sort", "排序1" });
	dict.insert({ "sort", "排序3" });
	dict.insert({ "sort", "排序" });
	dict.insert({ "string", "字符串" });
	dict.erase("sort");

	auto it = dict.begin();
	while (it != dict.end())
	{
		cout << it->first << " : " << it->second << endl;
		++it;
	}

	return 0;
}